home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
tools
/
sharp
/
sxwork2.lzh
/
サンプル基礎編
/
スクロール
/
SCROLL.C
< prev
next >
Wrap
Text File
|
1994-03-10
|
10KB
|
297 lines
/******************************************************************************
* scroll.c: 画面スクロール処理関数
******************************************************************************
* Workroom SX-68K Sample Program Copyright 1994 SHARP
*
* 機能説明:
* スクロールバーに対する処理と、それに付随する画面スクロールに関する
* 関数が、このソースファイルには収められています。
*/
#include <sxgraph.h> /* グラフ系マネージャを利用するときに必要 */
#include <window.h> /* ウィンドウマンを利用するときに必要 */
#include <control.h> /* コントロールマンを利用するときに必要 */
#include "scroll.h" /* このプログラム固有のヘッダファイル */
/******************************************************************************
* createScrollBar(): スクロールバーの作成
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 作成成功
* = FALSE: 作成失敗(終了)
*/
BOOLEAN createScrollBar(ComVal *pcv)
{
Rect rcH, rcV;
/* スクロールバーの位置と大きさを計算する */
rcH = rcV = pcv->windowPtr->graph.rect;
rcH.d.top = rcH.d.bottom - SCRLBR_H;
rcH.d.right -= SCRLBR_H;
rcV.d.left = rcV.d.right - SCRLBR_H;
rcV.d.bottom -= SCRLBR_H;
pcv->scrlBrHHdl = CMOpen( /* 横スクロールバーを作成する */
pcv->windowPtr, /* ウィンドウポインタ */
&rcH, /* 描画する位置と大きさ */
NONTITLE, /* タイトルは意味がない */
TRUE, /* 描画許可フラグ */
0, /* コントロールの初期値 */
0, /* コントロールの最小値 */
0, /* 最大値は描画前に再設定する */
CI_SCLBRWH << 4, /* 横スクロールバーのリソースID×16 */
0); /* ユーザーの初期値 */
if (pcv->scrlBrHHdl == NULL)
return FALSE; /* 失敗したのでFALSEを返す */
pcv->scrlBrVHdl = CMOpen( /* 縦スクロールバーを作成する */
pcv->windowPtr, /* ウィンドウポインタ */
&rcV, /* 描画する位置と大きさ */
NONTITLE, /* タイトルは意味がない */
TRUE, /* 描画許可フラグ */
0, /* コントロールの初期値 */
0, /* コントロールの最小値 */
0, /* 最大値は描画前に再設定する */
CI_SCLBRWV << 4, /* 縦スクロールバーのリソースID×16 */
0); /* ユーザーの初期値 */
if (pcv->scrlBrVHdl == NULL)
return FALSE; /* 失敗したのでFALSEを返す */
return TRUE; /* 成功したのでTRUEを返す */
}
/******************************************************************************
* checkScrollBar(): スクロールバーのチェック
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: スクロール中
* = FALSE: スクロール終了
*/
BOOLEAN checkScrollBar(ComVal *pcv)
{
int partCode; /* コントロールのパートコード */
int sig = 1; /* スクロールの方向(1 / -1) */
int offset[2];
int dir, term;
LPoint lpt;
Control **ctrlHdl; /* コントロールハンドル */
/* カレントグラフは、すでに設定されている */
offset[0] = pcv->dispX;
offset[1] = pcv->dispY;
lpt = GMGlobalToLocal(pcv->event.ev.where.x_y);
/* コントロールの上でマウスが押されたか? */
partCode = CMFind(lpt, pcv->windowPtr, &ctrlHdl);
switch (partCode) {
case C_INTHUMB: /* スクロールボックス */
CMCheck(ctrlHdl, lpt, NULL);
if (ctrlHdl == pcv->scrlBrHHdl)
offset[0] = CMValueGet(ctrlHdl);
else if (ctrlHdl == pcv->scrlBrVHdl)
offset[1] = CMValueGet(ctrlHdl);
break;
case C_INUP: /* スクロールアップボタン */
sig = -1;
/* この処理は下に続きます */
case C_INDOWN: /* スクロールダウンボタン */
/* SHIFTキーが押されてないか? */
if (!(pcv->event.ev.how & KS_SHIFT)) {
if (ctrlHdl == pcv->scrlBrHHdl)
dir = SCL_H;
else if (ctrlHdl == pcv->scrlBrVHdl)
dir = SCL_V;
else
break;
offset[dir] += FONTSIZE * 6 * sig;
if (offset[dir] < 0)
offset[dir] = 0;
else if (offset[dir] > CMMaxGet(ctrlHdl))
offset[dir] = CMMaxGet(ctrlHdl);
break;
}
/* この処理は下に続きます */
case C_INPGUP: /* ページスクロールアップボタン */
if (partCode == C_INPGUP)
sig = -1;
/* この処理は下に続きます */
case C_INPGDOWN: /* ページスクロールダウンボタン */
if (ctrlHdl == pcv->scrlBrHHdl) {
dir = SCL_H;
term = pcv->windowPtr->graph.rect.d.right;
} else if (ctrlHdl == pcv->scrlBrVHdl) {
dir = SCL_V;
term = pcv->windowPtr->graph.rect.d.bottom;
} else
break;
offset[dir] += (term - SCRLBR_H) * sig;
if (offset[dir] < 0)
offset[dir] = 0;
else if (offset[dir] > CMMaxGet(ctrlHdl))
offset[dir] = CMMaxGet(ctrlHdl);
break;
default:
return FALSE;
}
setScrollOffset(pcv, offset);
return TRUE;
}
/******************************************************************************
* setScrollOffset(): スクロールバーの値を設定し、スクロールを行う
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* int *poffset スクロールバーのオフセット値へのポインタ
* 戻り値: BOOLEAN = TRUE: 処理完了
* = FALSE: 確保失敗
*/
BOOLEAN setScrollOffset(ComVal *pcv, int *poffset)
{
int lastAP;
Point dpt;
Rect rc, drc, trc;
Region **rgnHdl;
/* カレントグラフは、すでに設定されている */
rc = pcv->windowPtr->graph.rect;
rc.d.right -= SCRLBR_H;
rc.d.bottom -= SCRLBR_H;
drc = rc;
dpt.p.x = pcv->dispX - poffset[0];
dpt.p.y = pcv->dispY - poffset[1];
GMSlideRect(&drc, dpt.x_y);
/* 現在とスクロール後の表示領域が重なるか? */
if (GMAndRect(&trc, &rc, &drc)) {
rgnHdl = GMNewRgn(); /* リージョンハンドルを確保する */
if (rgnHdl == NULL) {
pcv->errorCode = 8; /* 確保できなかった */
return FALSE; /* 失敗したのでFALSEを返す */
}
/* 描画するときのカラーが黒とライトグレーだけの場合、アクセス
ページを1ページのみにすると、描画やスクロールの速度が速く
なります */
lastAP = GMAPage(G_PAGE1);
GMScroll(&rc, dpt.x_y, rgnHdl);
GMAPage(lastAP); /* アクセスページを元に戻す */
/* グローバル座標系に変換する */
GMSlideRgn(rgnHdl, GMLocalToGlobal(0));
WMAddRgn(rgnHdl); /* アップデートリージョンに追加する */
GMDisposeRgn(rgnHdl); /* リージョンハンドルを解放する */
} else {
/* グローバル座標系に変換する */
GMSlideRect(&rc, GMLocalToGlobal(0));
WMAddRect(&rc); /* アップデートリージョンに追加する */
}
pcv->dispX = poffset[0]; /* 新しい値をワークに登録する */
pcv->dispY = poffset[1];
setScrollBar(pcv); /* スクロールバーを再描画する */
return TRUE; /* 処理が完了したのでTRUEを返す */
}
/******************************************************************************
* setScrollBar(): スクロールバーの値の設定
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void setScrollBar(ComVal *pcv)
{
ScrlVal svH, svV;
/* スクロールバーの現在値、最大値を算出する */
calcScrollBar(pcv, &svH, &svV);
if (svH.val != pcv->scrlH.val || svH.max != pcv->scrlH.max
|| svH.dMax != pcv->scrlH.dMax) { /* 値に変更があるか? */
/* コントロール定義関数のデータを設定する */
CMDefDataSet(pcv->scrlBrHHdl, LONGWORD(1, svH.dMax));
CMMaxSet(pcv->scrlBrHHdl, svH.max);
CMValueSet(pcv->scrlBrHHdl, svH.val);
pcv->scrlH = svH;
}
if (svV.val != pcv->scrlV.val || svV.max != pcv->scrlV.max
|| svV.dMax != pcv->scrlV.dMax) { /* 値に変更があるか? */
/* コントロール定義関数のデータを設定する */
CMDefDataSet(pcv->scrlBrVHdl, LONGWORD(1, svV.dMax));
CMMaxSet(pcv->scrlBrVHdl, svV.max);
CMValueSet(pcv->scrlBrVHdl, svV.val);
pcv->scrlV = svV;
}
}
/******************************************************************************
* calcScrollBar(): スクロールバーの現在値、最大値の算出
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* ScrlVal *pvalh 横スクロールバーの値を格納するポインタ
* ScrlVal *pvalv 縦スクロールバーの 〃
*/
void calcScrollBar(ComVal *pcv, ScrlVal *pvalh, ScrlVal *pvalv)
{
int edit, viewline, off, offv, offh;
Rect view, dest;
view = pcv->windowPtr->graph.rect; /* ビューレクタングル */
view.d.right -= SCRLBR_H;
view.d.bottom -= SCRLBR_H;
dest.l.l_t = view.l.l_t; /* ディスティネーションレクタングル */
dest.d.right = dest.d.left + pcv->logWidth;
dest.d.bottom = view.d.bottom;
offh = view.d.left - pcv->dispX; /* 表示開始位置までの補正座標 */
offv = view.d.top - pcv->dispY;
/* 縦方向のスクロール */
edit = pcv->logHeight; /* 全体の行数 */
/* テキスト先頭から表示の最下位行までの行数 */
off = view.d.bottom - offv;
edit = (edit < off) ? off : edit; /* 全体行数を補正する */
pvalv->dMax = edit; /* コントロール定義関数のデータ */
viewline = view.d.bottom - view.d.top;
pvalv->max = edit - viewline; /* 最大値を計算する */
pvalv->val = view.d.top - offv; /* 現在値を計算する */
/* 横方向のスクロール */
edit = dest.d.right - dest.d.left;
off = view.d.right - offh;
edit = (edit < off) ? off : edit; /* 全体桁数を補正する */
pvalh->dMax = edit; /* コントロール定義関数のデータ */
viewline = view.d.right - dest.d.left;
pvalh->max = edit - viewline; /* 最大値を計算する */
pvalh->val = dest.d.left - offh; /* 現在値を計算する */
}
/******************************************************************************
* resizeScrollBar(): ウィンドウとスクロールバーのサイズ変更
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void resizeScrollBar(ComVal *pcv)
{
Rect rcH, rcV;
/* スクロールバーの位置と大きさを計算する */
rcH = rcV = pcv->windowPtr->graph.rect;
rcH.d.top = rcH.d.bottom - SCRLBR_H;
rcH.d.right -= SCRLBR_H;
rcV.d.left = rcV.d.right - SCRLBR_H;
rcV.d.bottom -= SCRLBR_H;
CMHide(pcv->scrlBrHHdl); /* スクロールバーを消去する */
CMHide(pcv->scrlBrVHdl);
CMMove(pcv->scrlBrHHdl, rcH.l.l_t);
CMSize(pcv->scrlBrHHdl, LONGWORD(rcH.d.right - rcH.d.left, SCRLBR_H));
CMMove(pcv->scrlBrVHdl, rcV.l.l_t);
CMSize(pcv->scrlBrVHdl, LONGWORD(SCRLBR_H, rcV.d.bottom - rcV.d.top));
setScrollBar(pcv);
CMShow(pcv->scrlBrHHdl); /* スクロールバーを表示する */
CMShow(pcv->scrlBrVHdl);
WMDrawGBox(pcv->windowPtr); /* サイズボックスを描画する */
}